/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import com.adobe.test.Assert;

// var SECTION = "RegExp/exec-002";
// var VERSION = "ECMA_2";
// var TITLE   = "RegExp.prototype.exec(string)";

var testcases = getTestCases();

function getTestCases() {
    var array = new Array();
    var item = 0;

    /*
     * for each test case, verify:
     * - type of object returned
     * - length of the returned array
     * - value of lastIndex
     * - value of index
     * - value of input
     * - value of the array indices
     */

    AddRegExpCases(
        /(a|d|q|)x/i,
        "bcaDxqy",
        3,
        ["Dx", "D"] );

    AddRegExpCases(
        /(a|(e|q))(x|y)/,
        "bcaddxqy",
        6,
        ["qy","q","q","y"] );


    AddRegExpCases(
        /a+b+d/,
        "aabbeeaabbs",
        0,
        null );

    AddRegExpCases(
        /a*b/,
        "aaadaabaaa",
        4,
        ["aab"] );

    AddRegExpCases(
        /a*b/,
        "dddb",
        3,
        ["b"] );

    AddRegExpCases(
        /a*b/,
        "xxx",
        0,
        null );

    AddRegExpCases(
        /x\d\dy/,
        "abcx45ysss235",
        3,
        ["x45y"] );

    AddRegExpCases(
        /[^abc]def[abc]+/,
        "abxdefbb",
        2,
        ["xdefbb"] );

    AddRegExpCases(
        /(a*)baa/,
        "ccdaaabaxaabaa",
        9,
        ["aabaa", "aa"] );

    AddRegExpCases(
        /(a*)baa/,
        "aabaa",
        0,
        ["aabaa", "aa"] );

    AddRegExpCases(
        /q(a|b)*q/,
        "xxqababqyy",
        2,
        ["qababq", "b"] );

    AddRegExpCases(
        /(a(.|[^d])c)*/,
        "adcaxc",
        0,
        ["adcaxc", "axc", "x"] );

    AddRegExpCases(
        /(a*)b\1/,
        "abaaaxaabaayy",
        0,
        ["aba", "a"] );

    AddRegExpCases(
        /(a*)b\1/,
        "abaaaxaabaayy",
        0,
        ["aba", "a"] );

    AddRegExpCases(
        /(a*)b\1/,
        "cccdaaabaxaabaayy",
        6,
        ["aba", "a"] );

    AddRegExpCases(
        /(a*)b\1/,
        "cccdaaabqxaabaayy",
        7,
        ["b", ""] );

    AddRegExpCases(
        /"(.|[^"\\\\])*"/,
        'xx\"makudonarudo\"yy',
        2,
        ["\"makudonarudo\"", "o"] );

    AddRegExpCases(
        /"(.|[^"\\\\])*"/,
        "xx\"ma\"yy",
        2,
        ["\"ma\"", "a"] );


    function AddRegExpCases(
        regexp, pattern, index, matches_array ) {

        // prevent a runtime error

        if ( regexp.exec(pattern) == null || matches_array == null ) {
            array[item++] = Assert.expectEq(
                regexp + ".exec(" + pattern +")",
                matches_array,
                regexp.exec(pattern) );

            return;
        }
        array[item++] = Assert.expectEq(
            regexp + ".exec(" + pattern +").length",
            matches_array.length,
            regexp.exec(pattern).length );

        array[item++] = Assert.expectEq(
            regexp + ".exec(" + pattern +").index",
            index,
            regexp.exec(pattern).index );

        array[item++] = Assert.expectEq(
            regexp + ".exec(" + pattern +").input",
            pattern,
            regexp.exec(pattern).input );

        array[item++] = Assert.expectEq(
            regexp + ".exec(" + pattern +").toString()",
            matches_array.toString(),
            regexp.exec(pattern).toString() );
    /*
        var limit = matches_array.length > regexp.exec(pattern).length
                    ? matches_array.length
                    : regexp.exec(pattern).length;

        for ( var matches = 0; matches < limit; matches++ ) {
            array[item++] = Assert.expectEq(
                regexp + ".exec(" + pattern +")[" + matches +"]",
                matches_array[matches],
                regexp.exec(pattern)[matches] );
        }
    */
    }

    return array;
}
